package com.jiang.daily.Q731;

import java.util.Map;
import java.util.TreeMap;

/**
 * @author Jiang
 * @version 1.0
 * @date 2025/01/03 16:51
 */
// 直接遍历
// class MyCalendarTwo {
//     List<int[]> booked; // 单重预定
//     List<int[]> overlaps; // 双重预定

//     public MyCalendarTwo() {
//         booked = new ArrayList<int[]>();
//         overlaps = new ArrayList<int[]>();
//     }

//     public boolean book(int startTime, int endTime) {
//         for (int[] arr: overlaps) {
//             int l = arr[0], r = arr[1];
//             if (l < endTime && r > startTime) {
//                 return false;
//             }
//         }

//         for (int[] arr: booked) {
//             int l = arr[0], r = arr[1];
//             if (l < endTime && r > startTime) {
//                 overlaps.add(new int[] {Math.max(l, startTime), Math.min(r, endTime)});
//             }
//         }
//         booked.add(new int[]{startTime, endTime});
//         return true;
//     }
// }

// 差分数组
class MyCalendarTwo {
    TreeMap<Integer, Integer> map;

    public MyCalendarTwo() {
        map = new TreeMap<>();
    }

    public boolean book(int startTime, int endTime) {
        int maxBook = 0; // 统计在某个时间段内的预定数
        map.compute(startTime, (k, v) -> v == null ? 1 : v + 1); // 开始，预定数 + 1
        map.compute(endTime, (k, v) -> v == null ? -1 : v - 1); // 结束 预定数 - 1;
        for (Map.Entry<Integer, Integer> entry: map.entrySet()) {
            maxBook += entry.getValue();
            // 加上了startTime，预定数超过了2， 去除预定时间 startTime ~ endTime
            if (maxBook > 2) {
                map.computeIfPresent(startTime, (k, v) -> v - 1); // 不能直接移除，因为可能会和前面预定时间相同，减一即可
                map.computeIfPresent(endTime, (k, v) -> v + 1);
                return false;
            }
        }
        return true;
    }
}

